ํ (Wheel) ๋ฐฐํฌ ํ์๊ณผ ํ์ด์ฌ์ฉ ๋ฐ์ด๋๋ฆฌ ํจํค์ง ์์ฑ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ๋ค์ํ ํ๋ซํผ์์ ํจ์จ์ ์ด๊ณ ์์ ์ ์ธ ์ํํธ์จ์ด ๋ฐฐํฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
ํ (Wheel) ๋ฐฐํฌ ํ์: ํ์ด์ฌ์ฉ ๋ฐ์ด๋๋ฆฌ ํจํค์ง ๋ง๋ค๊ธฐ
ํ์ด์ฌ ์ํ๊ณ๋ ํจ์จ์ ์ธ ํจํค์ง ๊ด๋ฆฌ์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ์ด ์ํ๊ณ์ ์ด์ ์ค ํ๋๋ ์ข
์ข
.whl
ํ์ฅ์๋ก ์๋ณ๋๋ ํ (Wheel) ๋ฐฐํฌ ํ์์
๋๋ค. ์ด ๊ฐ์ด๋๋ ํ ํ์์ ๋ณต์ก์ฑ, ์ฅ์ , ๊ทธ๋ฆฌ๊ณ ์ํํ๊ณ ์์ ์ ์ธ ์ํํธ์จ์ด ๋ฐฐํฌ๋ฅผ ๋ชฉํ๋ก ํ๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ์ํด ํ์ด์ฌ์ฉ ๋ฐ์ด๋๋ฆฌ ํจํค์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
ํ (Wheel) ํ์์ด๋ ๋ฌด์์ธ๊ฐ?
ํ ํ์์ ํ์ด์ฌ์ฉ ๋น๋ ํจํค์ง ํ์์
๋๋ค. ์์ค ๋ฐฐํฌ(sdist)๋ณด๋ค ๋ ์ฝ๊ฒ ์ค์น๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๋ ์ค๋๋ egg ํ์์ ๋์ฒดํ๋ฉฐ ์ฌ๋ฌ ๋จ์ ์ ํด๊ฒฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ ํน์ ๊ตฌ์กฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ZIP ์์นด์ด๋ธ๋ก, pip
๋ฐ ๊ธฐํ ์ค์น ๋๊ตฌ๊ฐ ์์ค์์ ๋น๋ํ ํ์ ์์ด ํจํค์ง๋ฅผ ์ ์ํ๊ฒ ์ค์นํ ์ ์๊ฒ ํด์ค๋๋ค.
ํ (Wheel)์ ์ฃผ์ ํน์ง
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ (ํด๋นํ๋ ๊ฒฝ์ฐ): ํ ์ ํน์ ํ๋ซํผ ๋ฐ ์ํคํ ์ฒ(์: Windows 64๋นํธ, Linux x86_64)์ฉ์ผ๋ก ๋น๋๋๊ฑฐ๋ ํ๋ซํผ ๋ ๋ฆฝ์ (์์ ํ์ด์ฌ)์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์ด์ ์ฒด์ ์ ์ต์ ํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ์ฌ์ด ์ค์น: ํ ํ์์๋ ์ฌ์ ๋น๋๋ ๋ฐฐํฌํ์ด ํฌํจ๋์ด ์์ด ์ค์น ์ค ์ฝ๋ ์ปดํ์ผ ํ์์ฑ์ ์ต์ํํฉ๋๋ค. ์ด๋ ํนํ C ํ์ฅ ํ๋ก๊ทธ๋จ์ด๋ ๋ค๋ฅธ ์ปดํ์ผ๋ ๊ตฌ์ฑ ์์๊ฐ ์๋ ํจํค์ง์ ์ค์น ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ ํฌํจ: ํ ์ ์์กด์ฑ, ๋ฒ์ ์ ๋ณด, ์ง์
์ ๋ฑ ํจํค์ง์ ๋ํ ๋ชจ๋ ํ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ๋
pip
์ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์์กด์ฑ์ ์ฒ๋ฆฌํ๊ณ ํจํค์ง๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์นํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. - ์์์ ์ค์น:
pip
๋ ํ ์์ ํจํค์ง๋ฅผ ์์์ ์ผ๋ก ์ค์นํฉ๋๋ค. ์ด๋ ์ค์น๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๊ฑฐ๋ ์์ ํ ๋กค๋ฐฑ๋์ด ๋ถ์ผ์น๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ถ๋ถ์ ์ผ๋ก ์ค์น๋ ํจํค์ง๋ฅผ ๋ฐฉ์งํจ์ ์๋ฏธํฉ๋๋ค. - ์ฌํ์ฑ: ํ ์ ๋์ ํ๋ซํผ์ด ์ผ์นํ๋ค๊ณ ๊ฐ์ ํ ๋ ์ฌ์ปดํ์ผ ์์ด ์ฌ๋ฌ ํ๊ฒฝ์ ๊ฑธ์ณ ์ค์นํ ์ ์๋ ์ผ๊ด๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๊ณตํ์ฌ ์ฌํ์ฑ์ ํฅ์์ํต๋๋ค.
์ ํ (Wheel)์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
์์ค ๋ฐฐํฌ ๋์ ํ ์ ์ ํํ๋ฉด ์๋ง์ ์ด์ ์ด ์์ผ๋ฉฐ ํจํค์ง ์ค์น ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค. ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋ ๋น ๋ฅธ ์ค์น ์๊ฐ
ํ ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ ์๋์ ๋๋ค. ์ฌ์ ๋น๋๋ ๋ฐฐํฌํ์ ์ ๊ณตํจ์ผ๋ก์จ ํ ์ ์ค์น ์ค ์ฝ๋ ์ปดํ์ผ ํ์์ฑ์ ์์ ์ค๋๋ค. ์ด๋ C, C++ ๋๋ ๊ธฐํ ์ธ์ด๋ก ์์ฑ๋ ์ปดํ์ผ๋ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์๋ ํจํค์ง์ ํนํ ์ ์ฉํฉ๋๋ค. ๋ณต์กํ ๊ณผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๋ค๊ณ ์์ํด๋ณด์ธ์. ํ ์ ์ฌ์ฉํ๋ฉด ์ต์ข ์ฌ์ฉ์ ์ปดํจํฐ์ ์ค์น ์๊ฐ์ด ํฌ๊ฒ ๋จ์ถ๋ฉ๋๋ค.
์์: ์์ค์์ numpy
๋ฅผ ์ค์นํ๋ ๊ฒ์ ํนํ ์ค๋๋ ํ๋์จ์ด์์ ๋ช ๋ถ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ํ ์์ ์ค์นํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ช ์ด๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
๋น๋ ๋๊ตฌ์ ๋ํ ์์กด์ฑ ๊ฐ์
์์ค์์ ํจํค์ง๋ฅผ ์ค์นํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ์์คํ ์ ํ์ํ ๋น๋ ๋๊ตฌ(์ปดํ์ผ๋ฌ, ํค๋ ๋ฑ)๋ฅผ ์ค์นํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ํนํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ต์ํ์ง ์์ ์ฌ์ฉ์์๊ฒ ์ง์ ์ฅ๋ฒฝ์ด ๋ ์ ์์ต๋๋ค. ํ ์ ์ด๋ฌํ ์์กด์ฑ์ ์ ๊ฑฐํ์ฌ ์ค์น๋ฅผ ๋ ๊ฐ๋จํ๊ณ ์ ๊ทผํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์: ์ฐ๊ตฌ์ค์ ๋ฐ์ดํฐ ๊ณผํ์๋ ์์ค์์ ํจํค์ง๋ฅผ ๋น๋ํ๋ ๋ฐ ํ์ํ ์ปดํ์ผ๋ฌ๊ฐ ์์ ์ ์์ต๋๋ค. ํ ์ ์ฌ์ฉํ๋ฉด ํ๊ฒฝ์ ๊ตฌ์ฑํ ํ์ ์์ด ํจํค์ง๋ฅผ ์ง์ ์ค์นํ ์ ์์ต๋๋ค.
ํฅ์๋ ์ ๋ขฐ์ฑ
์ฌ์ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ํ ์ ํจํค์ง๊ฐ ์ฌ๋ฌ ํ๊ฒฝ์์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ค์น๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์์คํ ๊ตฌ์ฑ์ด๋ ๋น๋ ๋๊ตฌ ๋ฒ์ ์ ์ฐจ์ด๋ก ์ธํ ์ค์น ์ค๋ฅ ์ํ์ ์ค์ฌ์ค๋๋ค. ์ด๋ฌํ ์ผ๊ด์ฑ์ ์์ ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ๋์์ ์๊ตฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์: ์ฌ๋ฌ ์๋ฒ์ ๋ฐฐํฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๊ด๋ ํจํค์ง ๋ฒ์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ํ ์ ์ฌ์ฉํ๋ฉด ๊ฐ ์๋ฒ์ ๋์ผํ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ค์น๋๋๋ก ๋ณด์ฅํ์ฌ ๋ฐฐํฌ ๋ฌธ์ ์ ์ํ์ ์ต์ํํฉ๋๋ค.
๊ฐํ๋ ๋ณด์
ํ ์ ์ง์์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ๊ธฐ ์ํด ์๋ช ๋ ์ ์์ต๋๋ค. ์ด๋ ์ ์์ ์ธ ํ์์๊ฐ ๋ณ์กฐ๋ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ํจํค์ง ์๋ช ์ ์ถ๊ฐ์ ์ธ ๋ณด์ ๊ณ์ธต์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ขฐํ ์ ์๋ ์ํํธ์จ์ด๋ฅผ ์ค์นํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์: ์กฐ์ง์ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌ๋๊ธฐ ์ ์ ๋ชจ๋ ํจํค์ง์ ์๋ช ํ๋๋ก ์๊ตฌํ๋ ์ ์ฑ ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ฑ ์ฝ๋๊ฐ ํจํค์ง์ ์ฃผ์ ๋๋ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
ํ ํจํค์ง ๋ง๋ค๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
ํ ํจํค์ง๋ฅผ ๋ง๋๋ ๊ฒ์ setuptools
์ wheel
ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ๊ณผ์ ์
๋๋ค. ๋ค์์ ์์ธํ ๊ฐ์ด๋์
๋๋ค:
1. ํ๋ก์ ํธ ์ค์ ํ๊ธฐ
๋จผ์ , ํ๋ก์ ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์กฐํ๋์๋์ง ํ์ธํ์ธ์. ์ต์ํ setup.py
ํ์ผ๊ณผ ํจํค์ง์ ์์ค ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ ์์:
my_package/ โโโ my_module/ โ โโโ __init__.py โ โโโ my_function.py โโโ setup.py โโโ README.md
2. setup.py
ํ์ผ
setup.py
ํ์ผ์ ํ๋ก์ ํธ์ ํต์ฌ์
๋๋ค. ํจํค์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ๋น๋ ๋ฐ ์ค์น ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ๋ค์์ setup.py
ํ์ผ์ ์์์
๋๋ค:
from setuptools import setup, find_packages setup( name='my_package', version='0.1.0', description='A simple example package', long_description=open('README.md').read(), long_description_content_type='text/markdown', url='https://github.com/your_username/my_package', author='Your Name', author_email='your.email@example.com', license='MIT', packages=find_packages(), install_requires=['requests'], classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', ], )
์ฃผ์ ํ๋ ์ค๋ช :
name
: ํจํค์ง์ ์ด๋ฆ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ํจํค์ง๋ฅผ ์ค์นํ ๋ ์ฌ์ฉํ ์ด๋ฆ์ ๋๋ค(์:pip install my_package
).version
: ํจํค์ง์ ๋ฒ์ ๋ฒํธ์ ๋๋ค. ์ผ๊ด๋ ๋ฒ์ ๊ด๋ฆฌ ๊ดํ์ ์ํด ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ๋ฐ๋ฅด์ธ์(์:0.1.0
,1.0.0
,2.5.1
).description
: ํจํค์ง์ ๋ํ ๊ฐ๋จํ ์ค๋ช ์ ๋๋ค.long_description
: ํจํค์ง์ ๋ํ ์์ธํ ์ค๋ช ์ ๋๋ค. ์ข ์ขREADME.md
ํ์ผ์์ ์ฝ์ด์ต๋๋ค.url
: ํจํค์ง์ ํํ์ด์ง ๋๋ ์ ์ฅ์ URL์ ๋๋ค.author
: ํจํค์ง ์์ฑ์์ ์ด๋ฆ์ ๋๋ค.author_email
: ํจํค์ง ์์ฑ์์ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.license
: ํจํค์ง๊ฐ ๋ฐฐํฌ๋๋ ๋ผ์ด์ ์ค์ ๋๋ค(์: MIT, Apache 2.0, GPL).packages
: ๋ฐฐํฌ์ ํฌํจํ ํจํค์ง ๋ชฉ๋ก์ ๋๋ค.find_packages()
๋ ํ๋ก์ ํธ์ ๋ชจ๋ ํจํค์ง๋ฅผ ์๋์ผ๋ก ์ฐพ์ต๋๋ค.install_requires
: ํจํค์ง์ ํ์ํ ์์กด์ฑ ๋ชฉ๋ก์ ๋๋ค.pip
๋ ํจํค์ง๊ฐ ์ค์น๋ ๋ ์ด๋ฌํ ์์กด์ฑ์ ์๋์ผ๋ก ์ค์นํฉ๋๋ค.classifiers
: ์ฌ์ฉ์๊ฐ PyPI(Python Package Index)์์ ํจํค์ง๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. ์ด ๋ถ๋ฅ์๋ ๊ฐ๋ฐ ์ํ, ๋์ ๊ณ ๊ฐ, ๋ผ์ด์ ์ค ๋ฐ ์ง์๋๋ ํ์ด์ฌ ๋ฒ์ ์ ์ค๋ช ํฉ๋๋ค.
3. wheel
์ค์นํ๊ธฐ
wheel
ํจํค์ง๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด pip
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ ์ ์์ต๋๋ค:
pip install wheel
4. ํ ํจํค์ง ๋น๋ํ๊ธฐ
ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ(setup.py
๊ฐ ์๋ ๊ณณ)๋ก ์ด๋ํ์ฌ ๋ค์ ๋ช
๋ น์ ์คํํ์ธ์:
python setup.py bdist_wheel
์ด ๋ช
๋ น์ ํ ํจํค์ง(.whl
ํ์ผ)์ ์์ค ๋ฐฐํฌํ(.tar.gz
ํ์ผ)์ ํฌํจํ๋ dist
๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
5. ํ ํ์ผ ์ฐพ๊ธฐ
์์ฑ๋ ํ ํ์ผ์ dist
๋๋ ํฐ๋ฆฌ์ ์์นํฉ๋๋ค. ํ์ผ ์ด๋ฆ์ package_name-version-pyXX-none-any.whl
ํ์์ ๋ฐ๋ฅด๋ฉฐ, ์ฌ๊ธฐ์ ๊ฐ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
package_name
: ํจํค์ง์ ์ด๋ฆ์ ๋๋ค.version
: ํจํค์ง์ ๋ฒ์ ๋ฒํธ์ ๋๋ค.pyXX
: ํจํค์ง๊ฐ ํธํ๋๋ ํ์ด์ฌ ๋ฒ์ ์ ๋๋ค(์:py37
๋ ํ์ด์ฌ 3.7).none
: ํจํค์ง๊ฐ ํ๋ซํผ์ ํน์ ๋์ง ์์์์ ๋ํ๋ ๋๋ค.any
: ํจํค์ง๊ฐ ๋ชจ๋ ์ํคํ ์ฒ์ ํธํ๋จ์ ๋ํ๋ ๋๋ค.
ํ๋ซํผ๋ณ ํ ์ ๊ฒฝ์ฐ none
๋ฐ any
ํ๊ทธ๋ ํ๋ซํผ ๋ฐ ์ํคํ
์ฒ ์๋ณ์(์: Windows 64๋นํธ์ ๊ฒฝ์ฐ win_amd64
)๋ก ๋์ฒด๋ฉ๋๋ค.
6. ํ ํจํค์ง ํ ์คํธํ๊ธฐ
ํ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น๋๋์ง ํ
์คํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. pip
๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํ ์ ์์ต๋๋ค:
pip install dist/my_package-0.1.0-py39-none-any.whl
dist/my_package-0.1.0-py39-none-any.whl
์ ์ค์ ํ ํ์ผ ๊ฒฝ๋ก๋ก ๋ฐ๊พธ์ธ์.
7. ํ ํจํค์ง ๋ฐฐํฌํ๊ธฐ
ํ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ ํ ์คํธํ ํ์๋ ๋ค์ํ ์ฑ๋์ ํตํด ๋ฐฐํฌํ ์ ์์ต๋๋ค:
- PyPI (Python Package Index): ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
twine
์ ์ฌ์ฉํ์ฌ PyPI์ ํ ํจํค์ง๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค. - ์ฌ์ค ํจํค์ง ์ธ๋ฑ์ค: ์กฐ์ง ๋ด ๋ด๋ถ ์ฌ์ฉ์ ์ํด
devpi
๋ Artifactory์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ค ํจํค์ง ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. - ์ง์ ๋ฐฐํฌ: ์ด๋ฉ์ผ, ํ์ผ ๊ณต์ ๋๋ ๊ธฐํ ์๋จ์ ํตํด ์ฌ์ฉ์์๊ฒ ํ ํจํค์ง๋ฅผ ์ง์ ๋ฐฐํฌํ ์๋ ์์ต๋๋ค.
C ํ์ฅ ๋ฐ ํ๋ซํผ๋ณ ํ ์ฒ๋ฆฌํ๊ธฐ
ํ๋ซํผ๋ณ ํ , ํนํ C ํ์ฅ์ ํฌํจํ๋ ํ ์ ๋ง๋ค๋ ค๋ฉด ์ถ๊ฐ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค. ๋ค์์ ๊ทธ ๊ณผ์ ์ ๋ํ ๊ฐ์์ ๋๋ค:
1. C ํ์ฅ ์ปดํ์ผํ๊ธฐ
C ํ์ฅ์ ๊ฐ ๋์ ํ๋ซํผ์ ๋ง๊ฒ ์ปดํ์ผํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ผ๋ฐ์ ์ผ๋ก C ์ปดํ์ผ๋ฌ(์: GCC, MSVC)์ ํ๋ซํผ๋ณ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์: Windows์์๋ C ํ์ฅ์ ๋น๋ํ๊ธฐ ์ํด Microsoft Visual C++ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Linux์์๋ ์ผ๋ฐ์ ์ผ๋ก GCC๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. cffi
๋๋ Cython
์ฌ์ฉํ๊ธฐ
cffi
๋ Cython
๊ณผ ๊ฐ์ ๋๊ตฌ๋ C ํ์ฅ์ ๋ง๋๋ ๊ณผ์ ์ ๋จ์ํํ ์ ์์ต๋๋ค. cffi
๋ฅผ ์ฌ์ฉํ๋ฉด C ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ํ์ด์ฌ์์ C ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ, Cython
์ ์ฌ์ฉํ๋ฉด C ํ์ฅ์ผ๋ก ์ปดํ์ผ๋๋ C์ ์ ์ฌํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
3. ํ๋ซํผ๋ณ ์์กด์ฑ ์ ์ํ๊ธฐ
setup.py
ํ์ผ์์ setup_requires
๋ฐ install_requires
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ซํผ๋ณ ์์กด์ฑ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋ซํผ๋ง๋ค ๋ค๋ฅธ ์์กด์ฑ์ ์ง์ ํ ์ ์์ต๋๋ค.
์์:
from setuptools import setup, Extension import platform if platform.system() == 'Windows': extra_compile_args = ['/O2', '/EHsc'] else: extra_compile_args = ['-O3'] setup( name='my_package', version='0.1.0', ext_modules=[ Extension( 'my_package.my_extension', ['my_package/my_extension.c'], extra_compile_args=extra_compile_args, ), ], )
4. ํ๋ซํผ๋ณ ํ ๋น๋ํ๊ธฐ
ํ๋ซํผ๋ณ ํ ์ ๋น๋ํ๋ ค๋ฉด ๊ฐ ๋์ ํ๋ซํผ์ ์ ํฉํ ๋น๋ ํ๊ฒฝ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ์ ๋จธ์ ์ด๋ Docker์ ๊ฐ์ ์ปจํ ์ด๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์์: Windows 64๋นํธ์ฉ ํ ์ ๋น๋ํ๋ ค๋ฉด Microsoft Visual C++ ์ปดํ์ผ๋ฌ๊ฐ ์ค์น๋ Windows 64๋นํธ ์์คํ ์์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
ํ ํจํค์ง ์์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ํ ํจํค์ง๊ฐ ์ ๋ขฐํ ์ ์๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ์ฌ์์ง๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ถ์ฅ ์ฌํญ์ ๋๋ค:
1. ์๋งจํฑ ๋ฒ์ ๋(SemVer) ์ฌ์ฉํ๊ธฐ
์ผ๊ด๋ ๋ฒ์ ๊ด๋ฆฌ ๊ดํ์ ์ํด ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ๋ฐ๋ฅด์ธ์. SemVer๋ ์ธ ๋ถ๋ถ์ผ๋ก ๋ ๋ฒ์ ๋ฒํธ(MAJOR.MINOR.PATCH
)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ณ๊ฒฝ ์ ํ์ ๋ํ๋
๋๋ค.
- MAJOR: ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ ๋ํ๋ ๋๋ค.
- MINOR: ํ์ ํธํ์ฑ์ ์ ์งํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ๋ ๋๋ค.
- PATCH: ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ ์์ ์ ๋ํ๋ ๋๋ค.
์์: ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค๋ ๋ฐฉ์์ผ๋ก ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฃผ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ ค์ผ ํฉ๋๋ค(์: 1.0.0์์ 2.0.0์ผ๋ก). ๊ธฐ์กด ํจ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋ถ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ ค์ผ ํฉ๋๋ค(์: 1.0.0์์ 1.1.0์ผ๋ก). ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ฉด ์ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ ค์ผ ํฉ๋๋ค(์: 1.0.0์์ 1.0.1๋ก).
2. README.md
ํ์ผ ํฌํจํ๊ธฐ
์ค์น ์ง์นจ, ์ฌ์ฉ ์์, ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ์ ํฌํจํ์ฌ ํจํค์ง์ ๋ํ ์์ธํ ์ค๋ช
์ ์ ๊ณตํ๋ README.md
ํ์ผ์ ํฌํจํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ํจํค์ง ์ฌ์ฉ๋ฒ์ ์ดํดํ๊ณ ๊ธฐ์ฌ๋ฅผ ์ฅ๋ คํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3. ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์ ์์ฑํ๊ธฐ
API ๋ฌธ์, ํํ ๋ฆฌ์ผ, ์์ ๋ฅผ ํฌํจํ์ฌ ํจํค์ง์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์์ฑํ์ธ์. Sphinx๋ Read the Docs์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ฃผ์์์ ๋ฌธ์๋ฅผ ์์ฑํ์ธ์.
4. ๋ผ์ด์ ์ค ์ฌ์ฉํ๊ธฐ
ํจํค์ง๋ฅผ ์ฌ์ฉ, ์์ ๋ฐ ๋ฐฐํฌํ ์ ์๋ ์กฐ๊ฑด์ ๋ช ํํ๊ฒ ์ ์ํ๋ ๋ผ์ด์ ์ค๋ฅผ ์ ํํ์ธ์. ์ผ๋ฐ์ ์ธ ๋ผ์ด์ ์ค๋ก๋ MIT, Apache 2.0, GPL์ด ์์ต๋๋ค.
5. ํจํค์ง๋ฅผ ์ฒ ์ ํ ํ ์คํธํ๊ธฐ
pytest
๋ unittest
์ ๊ฐ์ ์๋ํ๋ ํ
์คํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ์ฒ ์ ํ ํ
์คํธํ์ธ์. ๋จ์ ํ
์คํธ, ํตํฉ ํ
์คํธ, ์ข
๋จ ๊ฐ ํ
์คํธ๋ฅผ ์์ฑํ์ฌ ํจํค์ง๊ฐ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ธ์.
6. ์ง์์ ํตํฉ(CI) ์ฌ์ฉํ๊ธฐ
GitHub Actions, GitLab CI, Jenkins์ ๊ฐ์ ์ง์์ ํตํฉ(CI) ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋๋ง๋ค ํจํค์ง๋ฅผ ์๋์ผ๋ก ๋น๋ํ๊ณ ํ ์คํธํ์ธ์. ์ด๋ ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ํจํค์ง๊ฐ ํญ์ ์๋ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
7. ํจํค์ง์ ์๋ช ํ๊ธฐ
ํจํค์ง์ ์๋ช
ํ์ฌ ์ง์์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ์ธ์. ์ด๋ ์
์์ ์ธ ํ์์๊ฐ ๋ณ์กฐ๋ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. gpg
๋ keyring
๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง์ ์๋ช
ํ์ธ์.
๊ณ ๊ธ ํ (Wheel) ๊ธฐ์
๋ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํด ๋ค์ ๊ธฐ์ ์ ๊ณ ๋ คํด ๋ณด์ธ์:
1. build
์ฌ์ฉํ๊ธฐ
build
ํจํค์ง๋ ํ์ด์ฌ ํจํค์ง๋ฅผ ๋น๋ํ๋ ํ๋์ ์ด๊ณ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ ๊ณผ ์์ค ๋ฐฐํฌํ์ ๋ชจ๋ ์ง์ํ๋ฉฐ setuptools
๋ณด๋ค ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
pip install build python -m build
2. ํธ์ง ๊ฐ๋ฅ ๋ชจ๋(Editable) ์ค์น
ํธ์ง ๊ฐ๋ฅ ๋ชจ๋ ์ค์น๋ฅผ ์ฌ์ฉํ๋ฉด ์์ค ์ฝ๋์ ์ง์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์์ผ๋ก ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์ ์ ์ฉํ๋ฉฐ, ์์ค ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฌ์ค์น ์์ด ์ค์น๋ ํจํค์ง์ ์ฆ์ ๋ฐ์๋ฉ๋๋ค.
pip install -e .
3. ๋น๋ ํ๋ก์ธ์ค ์ฌ์ฉ์ ์ ์ํ๊ธฐ
์ฌ์ฉ์ ์ ์ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ๊ฑฐ๋ Meson ๋๋ CMake์ ๊ฐ์ ๋น๋ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํน์ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ก C ํ์ฅ์ ๋น๋ํ๊ฑฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๋ฑ ๋ ๋ณต์กํ ๋น๋ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
4. auditwheel
์ฌ์ฉํ๊ธฐ
auditwheel
๋๊ตฌ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋ฆฌ๋
์ค ํ ์ ๊ฐ์ฌํ๊ณ ๋ณต๊ตฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ํ ์ด ๊ด๋ฒ์ํ ๋ฆฌ๋
์ค ๋ฐฐํฌํ์์ ์คํ๋๋ ๋ฐ ํ์ํ ๋ชจ๋ ์์กด์ฑ์ ํฌํจํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
pip install auditwheel auditwheel repair dist/my_package-0.1.0-py39-linux_x86_64.whl
๊ฒฐ๋ก
ํ ๋ฐฐํฌ ํ์์ ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์์ผ๋ฉฐ ์์ ํ ํจํค์ง ๋ฐฐํฌ๋ฅผ ๋ชฉํ๋ก ํ๋ ํ์ด์ฌ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํจ์ผ๋ก์จ ์ค์น ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ณ ๋น๋ ๋๊ตฌ์ ๋ํ ์์กด์ฑ์ ์ค์ด๋ฉฐ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ํ ํจํค์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์คํ ์์ค ์ปค๋ฎค๋ํฐ์ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ , ํ ํ์์ ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ ๋ชจ๋ ํ์ด์ฌ ๊ฐ๋ฐ์์๊ฒ ๊ท์คํ ๊ธฐ์ ์ ๋๋ค. ํ์ด์ฌ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ํ ๊ณผ ๊ฐ์ ํ๋์ ์ธ ํจํค์ง ๊ดํ์ ์์ฉํ๋ฉด ํ๋ก์ ํธ๊ฐ ์ ์ธ๊ณ ์ฌ์ฉ์๋ค์ด ์ ๊ทผํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๋๋ก ๋ณด์ฅ๋ฉ๋๋ค.
์ด๋ฌํ ๊ดํ์ ์์ฉํจ์ผ๋ก์จ ์ ์ธ๊ณ์ ์ผ๋ก ๋ ๊ฐ๋ ฅํ๊ณ ์ ๊ทผ์ฑ ๋์ ํ์ด์ฌ ์ํ๊ณ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.